272. istio將401的錯誤,自動轉成503

WHY

這其實是蠻弔詭的狀況,
後端程式,在本地測試是回401 (Unauthorized),
但到了QA就變成了502。
這件事我也只能吞了,開始查吧。

Solution

首先查一下,什麼情況下會自動轉成503。
服務放在GKE上,並且將目標Pod的sidecar關閉。
目標的Pod為A,同Namespcae不同的Pod為B。

從哪裡呼叫 目標位置 Status Code
外部 網址,istio 轉到A Service 502
B Pod A ip 502
B Service A ip 502
A Pod A ip 401
A Service A ip 401

但如果將B的sidecar也關閉, 則在B呼叫Pod 或 Service 都會回傳401。
這邊就不由得猜想是istio本身的問題。

於是自己寫了個Golang的小程式,自訂回傳狀態碼401。
一測試發現,我從外部呼叫,Status code是正常的回傳401。

看來istio沒問題,那就只剩下程式問題(甩鍋大成功)。
用curl -v 查看 401的錯誤訊息發現header有下面訊息。
272-fig.1.png

轉交給RD,請他們確認這邊的訊息。
後來改完程式後就正常了。

初步研判應該是istio判斷到 header有不明的訊息(見上圖),
觸發Retry機制,但觸發太多次,istio就直接回傳502的錯誤。